home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / gnu / othergnu / ispell.zoo / xgets.c < prev   
C/C++ Source or Header  |  1990-03-07  |  2KB  |  76 lines

  1.  
  2. #include "config.h"
  3. #include <stdio.h>
  4.  
  5. #ifndef MAXINCLUDEFILES
  6. #define MAXINCLUDEFILES    1    /* maximum number of new files in stack */
  7. #endif
  8.  
  9. /*
  10.  * xgets () acts just like gets () except that if a line matches
  11.  * "&Include_File&<something>" xgets () will start reading from the
  12.  * file <something>.
  13.  *
  14.  *  Andrew Vignaux -- andrew@vuwcomp  Fri May  8 16:40:23 NZST 1987
  15.  * modified
  16.  *  Mark Davies -- mark@vuwcomp  Mon May 11 22:38:10 NZST 1987
  17.  */
  18.  
  19. extern int incfileflag;        /* whether xgets() acts exactly like gets() */
  20.  
  21. char *
  22. xgets (str)
  23. char str [];
  24. {
  25. #if MAXINCLUDEFILES == 0
  26.     return gets (str);
  27. #else
  28.     static char * Include_File = DEFINCSTR;
  29.     static int    Include_Len = 0;
  30.     static FILE * F [MAXINCLUDEFILES+1], ** current_F = F;
  31.     char * s = str;
  32.     int c;
  33.  
  34.     /* read the environment variable if we havent already */
  35.     if (Include_Len == 0) {
  36.     char * env_variable, * getenv ();
  37.  
  38.     if ((env_variable = getenv (INCSTRVAR)) != NULL)
  39.         Include_File = env_variable;
  40.     Include_Len = strlen (Include_File);
  41.  
  42.     /* initialise the file stack */
  43.     *current_F = stdin;
  44.     }
  45.  
  46.     while (1) {
  47.         if ((c = getc (*current_F)) != EOF && c != '\n') {
  48.         *s++ = c;
  49.         continue;
  50.     }
  51.     *s = '\0';        /* end of line */
  52.     if (c == EOF)
  53.         if (current_F == F) { /* if end of standard input */
  54.         if (s == str) return (NULL);
  55.         } else {
  56.             (void) fclose (*(current_F--));
  57.               if (s == str) continue;
  58.         }
  59.  
  60.     if (incfileflag != 0 && strncmp (str, Include_File, Include_Len) == 0) {
  61.         char * file_name = str + Include_Len;
  62.         if (current_F - F < MAXINCLUDEFILES && strlen (file_name) > 0) {
  63.         FILE * f;
  64.         if (f = fopen (file_name, "r"))
  65.             *(++current_F) = f;
  66.         }
  67.         s = str;
  68.         continue;
  69.     }
  70.     break;
  71.     }
  72.     
  73.     return (str);
  74. #endif
  75. }
  76.